#ifndef DATABASE_H
#define DATABASE_H
#include <sqlite3.h>
#include <mutex>
#include <string>
#include <vector>
#include <memory>
#include "Logger.h"
// 自定义数据库异常类型
class DatabaseException : public std::runtime_error {
public:
    explicit DatabaseException(const std::string& msg, int errorCode = -1)
        : std::runtime_error("[" + std::to_string(errorCode) + "] " + msg),
          errorCode(errorCode) {}
    int getErrorCode() const noexcept { return errorCode; }
private:
    int errorCode;
};
class Database {
public:
    // 单例访问点（双检锁模式）
    static Database& getInstance() {
        static Database instance;
        return instance;
    }
    // 初始化数据库连接
    void initialize(const std::string& dbPath);
    // 执行无返回的SQL语句
    void execute(const std::string& sql);
    // 参数化查询执行（防止SQL注入）
    void executePrepared(
        const std::string& sql,
        const std::vector<std::string>& params = {});
    // 查询执行接口
    class QueryResult {
    public:
        using Row = std::vector<std::string>;
        using Rows = std::vector<Row>;
        bool hasData() const { return !rows.empty(); }
        const Rows& getRows() const { return rows; }
        const Row& getFirstRow() const { return rows.front(); }
    private:
        friend class Database;
        Rows rows;
        std::vector<std::string> columnNames;
    };
    
    QueryResult executeQuery(
        const std::string& sql,
        const std::vector<std::string>& params = {});
    // 事务管理接口
    void beginTransaction();
    void commitTransaction();
    void rollbackTransaction();
    // 禁止拷贝操作
    Database(const Database&) = delete;
    Database& operator=(const Database&) = delete;
private:
    Database() = default;
    ~Database();
    // 内部连接管理
    void checkConnection();
    void reopenConnection();
    // SQLite回调函数
    static int queryCallback(void* data, int argc, char** argv, char** colNames);
    // 数据库连接句柄
    sqlite3* dbHandle = nullptr;
    
    // 连接互斥锁
    std::mutex connectionMutex;
    
    // 操作互斥锁
    std::mutex operationMutex;
    // 数据库文件路径
    std::string databasePath;
    // 事务计数器
    int transactionDepth = 0;
};
#endif // DATABASE_H